home *** CD-ROM | disk | FTP | other *** search
- /* Copyright 1990 by Christopher A. Wichura.
- See file GIFMachine.doc for full description of rights.
- */
-
- #include "GIFMachine.h"
-
- extern struct GIFdescriptor gdesc;
- EXTERNBITPLANE;
-
- extern char *AbortMsg;
-
- extern int NoBorderLineThresh;
-
- #define BorderCheck(a, b) ((BitPlane[b][a].rgb_Red != BorderCol.rgb_Red) || \
- (BitPlane[b][a].rgb_Green != BorderCol.rgb_Green) || \
- (BitPlane[b][a].rgb_Blue != BorderCol.rgb_Blue))
-
- void StripBorder(void)
- {
- register UWORD x;
- register UWORD y;
- register int thresh;
- register BOOL breakout;
- LONG LeftEdge, TopEdge;
- LONG Width, Height;
- UWORD OrigWidth, OrigHeight;
- int WidthThresh, HeightThresh;
- int Corner;
-
- struct RGB BorderCol;
-
- PutStr("...Removing border.\n");
-
- OrigWidth = gdesc.gd_Width;
- OrigHeight = gdesc.gd_Height;
-
- for (Corner = 0; Corner < 4; Corner++) {
- x = (Corner & 1) ? (gdesc.gd_Width - 1) : 0;
- y = (Corner & 2) ? (gdesc.gd_Height - 1) : 0;
-
- BorderCol = BitPlane[y][x];
-
- WidthThresh = NoBorderLineThresh * gdesc.gd_Width / 100;
- HeightThresh = NoBorderLineThresh * gdesc.gd_Height / 100;
-
- for (breakout = y = 0; (y < gdesc.gd_Height) && !breakout; y++) {
- for (thresh = x = 0; x < gdesc.gd_Width; x++)
- if (BorderCheck(x, y))
- if (++thresh > WidthThresh) {
- breakout = TRUE;
- break;
- }
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- PutStr(AbortMsg);
- MyExit(ABORTEXITVAL);
- }
- }
-
- TopEdge = y - 1;
-
- for (breakout = 0, y = gdesc.gd_Height - 1; (y > 0) && !breakout; y--) {
- for (thresh = x = 0; x < gdesc.gd_Width; x++)
- if (BorderCheck(x, y))
- if (++thresh > WidthThresh) {
- breakout = TRUE;
- break;
- }
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- PutStr(AbortMsg);
- MyExit(ABORTEXITVAL);
- }
- }
-
- Height = y - TopEdge + 2;
-
- for (breakout = x = 0; (x < gdesc.gd_Width) && !breakout; x++) {
- for (thresh = y = 0; y < gdesc.gd_Height; y++)
- if (BorderCheck(x, y))
- if (++thresh > HeightThresh) {
- breakout = TRUE;
- break;
- }
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- PutStr(AbortMsg);
- MyExit(ABORTEXITVAL);
- }
- }
-
- LeftEdge = x - 1;
-
- for (breakout = 0, x = gdesc.gd_Width - 1; (x > 0) && !breakout; x--) {
- for (thresh = y = 0; y < gdesc.gd_Height; y++)
- if (BorderCheck(x, y))
- if (++thresh > HeightThresh) {
- breakout = TRUE;
- break;
- }
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- PutStr(AbortMsg);
- MyExit(ABORTEXITVAL);
- }
- }
-
- Width = x - LeftEdge + 2;
-
- if ((Width != gdesc.gd_Width) || (Height != gdesc.gd_Height)) {
- if (Width < 5 || Height < 5) {
- PutStr("......Too much of picture would be removed. Not modified.\n");
- return;
- }
-
- for (y = 0; y < Height; y++) {
- for (x = 0; x < Width; x++)
- BitPlane[y][x] = BitPlane[TopEdge + y][LeftEdge + x];
-
- BitPlane[y][x].rgb_Red =
- BitPlane[y][x].rgb_Green =
- BitPlane[y][x].rgb_Blue = 0;
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- PutStr(AbortMsg);
- MyExit(ABORTEXITVAL);
- }
- }
-
- gdesc.gd_Width = Width;
- gdesc.gd_Height = Height;
- }
- }
-
- if ((gdesc.gd_Width != OrigWidth) || (gdesc.gd_Height != OrigHeight)) {
- if (gdesc.gd_Width & 1)
- gdesc.gd_Width++;
-
- MyPrintf("......New width = %ld, New height = %ld\n",
- gdesc.gd_Width, gdesc.gd_Height);
- }
- }
-